package com.bottle.webdemo;

import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.JsPromptResult;
import android.webkit.JsResult;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import java.util.HashMap;
import java.util.Set;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String JS_URL_SCHEME = "jsAndroid";

    private WebView mWebView;
    private TextView txt_content;
    private String content = "";

    @SuppressLint({"SetJavaScriptEnabled", "AddJavascriptInterface"})
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        txt_content = findViewById(R.id.txt_content);

        mWebView = findViewById(R.id.webView);
        WebSettings webSettings = mWebView.getSettings();

        // 设置与Js交互的权限
        webSettings.setJavaScriptEnabled(true);
        // 设置允许JS弹窗
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
        mWebView.setWebChromeClient(webChromeClient);
        mWebView.setWebViewClient(webViewClient);
        mWebView.addJavascriptInterface(new AndroidToJs(), "test");

        // 先载入JS代码
        // 格式规定为:file:///android_asset/文件名.html
        mWebView.loadUrl("file:///android_asset/demo.html");
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_js1:
                // 通过Handler发送消息
                mWebView.post(new Runnable() {
                    @Override
                    public void run() {

                        // 注意调用的JS方法名要对应上
                        // 调用javascript的callJS()方法
                        evaluateJavascript(mWebView, "callJS()");

                        setContent("调用javascript的callJS()方法\n");
                    }
                });
                break;

            case R.id.btn_js2:
                evaluateJavascript(mWebView, "callJSParams('this is test')");
                setContent("callJSParams(params)带参数的方法\n");
                break;
        }
    }

    private void evaluateJavascript(WebView webView,String fun){
        if (webView == null || TextUtils.isEmpty(fun)) return;
        //该方法在 Android 4.4 版本才可使用，所以使用时需进行版本判断
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT){
            webView.loadUrl("javascript:"+fun);

        }else {
            webView.evaluateJavascript("javascript:" + fun, new ValueCallback<String>() {
                @Override
                public void onReceiveValue(String value) {
                    //此处为 js 返回的结果
                   if (!TextUtils.isEmpty(value) && !"null".equals(value)){
                       addContent("js 返回的结果:"+value+"\n");
                       Toast.makeText(MainActivity.this, value ,Toast.LENGTH_SHORT).show();
                   }
                }
            });
        }
    }

    class AndroidToJs {

        // 被JS调用的方法必须加入@JavascriptInterface注解
        @JavascriptInterface
        public void hello(String msg) {
            String value = "";
            if (TextUtils.isEmpty(msg) || "null".equals(msg)){
                value = "js调用了android中的hello方法";

            }else {
                value = "调用hello(),参数为:"+msg;
            }
            Ts.show(value);
            setContent(value);
        }



    }

    private void setContent(String str){
        content = str;
        txt_content.setText(content);
    }

    private void addContent(String str){
        content += str;
        txt_content.setText(content);
    }

    private WebChromeClient webChromeClient = new WebChromeClient(){

        // 由于设置了弹窗检验调用结果,所以需要支持js对话框
        // webview只是载体，内容的渲染需要使用webviewChromClient类去实现
        // 通过设置WebChromeClient对象处理JavaScript的对话框
        //设置响应js 的Alert()函数
        @Override
        public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
            AlertDialog.Builder b = new AlertDialog.Builder(MainActivity.this);
            b.setTitle("Alert");
            b.setMessage(message);
            b.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    result.confirm();
                }
            });
            b.setCancelable(false);
            b.create().show();
//            return super.onJsAlert(view, url, message, result);
            return true;
        }

        @Override
        public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
            // 根据协议的参数，判断是否是所需要的url(原理同方式2)
            // 一般根据scheme（协议格式） & authority（协议名）判断（前两个参数）
            //假定传入进来的 url = "js://webview?arg1=111&arg2=222"（同时也是约定好的需要拦截的）

            Uri uri = Uri.parse(message);
            // 如果url的协议 = 预先约定的 js 协议
            // 就解析往下解析参数
            if ( uri.getScheme().equalsIgnoreCase(JS_URL_SCHEME)) {

                // 如果 authority  = 预先约定协议里的 webview，即代表都符合约定的协议
                // 所以拦截url,下面JS开始调用Android需要的方法
                if (uri.getAuthority().equals("demo")) {

                    //
                    // 执行JS所需要调用的逻辑
                    setContent("js调用了Android的方法,通过onJsPrompt()拦截URL，参数为:"+uri.getQuery());
                }
                return true;
            }
            return super.onJsPrompt(view, url, message, defaultValue, result);
        }
    };

    private WebViewClient webViewClient = new WebViewClient(){
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {

            // 步骤2：根据协议的参数，判断是否是所需要的url
            // 一般根据scheme（协议格式） & authority（协议名）判断（前两个参数）
            //假定传入进来的 url = "jsAndroid://webview?arg1=111&arg2=222"（同时也是约定好的需要拦截的）

            Uri uri = Uri.parse(url);
            // 如果url的协议 = 预先约定的 js 协议
            // 就解析往下解析参数
            if ( uri.getScheme().equalsIgnoreCase(JS_URL_SCHEME)) {

                // 如果 authority  = 预先约定协议里的 webview，即代表都符合约定的协议
                // 所以拦截url,下面JS开始调用Android需要的方法
                if (uri.getAuthority().equals("webview")) {

                    //  步骤3：
                    // 执行JS所需要调用的逻辑
                    System.out.println("js调用了Android的方法");
                    // 可以在协议上带有参数并传递到Android上
                    setContent("js调用了Android的方法,通过拦截URL，参数为:"+uri.getQuery());
                }

                return true;
            }

            return super.shouldOverrideUrlLoading(view, url);
        }
    };

}
